package org.agile4j.patterns.command.calculator;

import java.util.ArrayList;
import java.util.List;

public class Calculator {
	/**
	 * 持有执行加法的命令对象
	 */
	private Command addCmd = null ;
	/**
	 * 持有执行减法的命令对象
	 */
	private Command subtractCmd = null ;
	
	private List<Command> undoCmds = new ArrayList<Command>() ;
	private List<Command> redoCmds = new ArrayList<Command>() ;
	
	/**
	 * 设置执行加法的命令对象
	 * @param command
	 */
	public void setAddCmd(Command command){
		this.addCmd = command ;
	}
	
	/**
	 * 设置执行减法的命令对象
	 * @param command
	 */
	public void setSubstractCmd(Command command){
		this.subtractCmd = command ;
	}
	
	public void addPressed(){
		this.addCmd.execute();
		this.undoCmds.add(this.addCmd) ;
	}
	
	public void substractPressed(){
		this.subtractCmd.execute();
		this.undoCmds.add(this.subtractCmd) ;
	}
	
	public void undoPressed(){
		if(this.undoCmds.size()>0){
			// 取出最后一个命令来撤销
			Command cmd = this.undoCmds.get(this.undoCmds.size()-1) ;
			cmd.undo();
			// 把这个命令记录到可撤销的历史记录里面
			this.redoCmds.add(cmd) ;
			// 然后把最后一个命令删除
			this.undoCmds.remove(cmd) ;
			
			
		} else {
			System.out.println("没有可撤销的命令.");
		}
	}
	
	public void redoPressed(){
		if(this.redoCmds.size() > 0){
			Command cmd = this.redoCmds.get(this.redoCmds.size() - 1) ;
			cmd.execute();
			// 把这个命令记录到可撤销的历史记录里面
			this.undoCmds.add(cmd) ;
			// 然后把最后一个命令删除掉
			this.redoCmds.remove(cmd) ;
		} else{
			System.out.println("没有可恢复的命令");
		}
	}
}
